package com.stefanini.pe.bbva.bp.in.dao.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.stereotype.Repository;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.stefanini.pe.bbva.bp.in.dao.iface.ClienteDAOIface;
import com.stefanini.pe.bbva.bp.in.to.Cliente;
import com.stefanini.pe.bbva.bp.in.to.NoCliente;
import com.stefanini.pe.bbva.bp.in.to.UsuarioAsesor;
import com.stefanini.pe.bbva.bp.in.to.UsuarioSesion;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Repository
public class ClienteDAOImpl extends SqlMapClientDaoSupport implements ClienteDAOIface {
	
	@Autowired
	public ClienteDAOImpl(SqlMapClient sqlMapClient) {
		setSqlMapClient(sqlMapClient);
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> listarClientes(Cliente oCliente) throws Exception{
		Map map = new LinkedHashMap();
		map.put("tipdoc", oCliente.getTipdoc());
		map.put("nrodoc", oCliente.getNrodoc());
		map.put("indpropio", oCliente.getIndpropio());
		map.put("idperfil", oCliente.getIdperfil()==null?0:oCliente.getIdperfil());
		map.put("in_idusuarioasesor", oCliente.getCboIdUsuarioAsesor());
		map.put("in_idejecutivo", oCliente.getIdusuarioasesor()==null?0:oCliente.getIdusuarioasesor());		
		map.put("in_perfilado", oCliente.getPerfilado());
		map.put("in_rebalanceo", oCliente.getRebalanceado());
		map.put("in_sitperfilado", oCliente.getSitperfilado());
		map.put("in_sitrebalanceo", oCliente.getSitrebalanceo());
		map.put("in_desdeperfilado", oCliente.getDesdeperfilado());
		map.put("in_hastaperfilado", oCliente.getHastaperfilado());
		map.put("in_desderebalanceo", oCliente.getDesderebalanceo());
		map.put("in_hastarebalanceo", oCliente.getHastarebalanceo());
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA.sp_cons_as_cl, params: "+map);
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarClientes", map);
		return (List<Cliente>)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<NoCliente> listarNoClientes(NoCliente oCliente) throws Exception{
		HashMap map=new HashMap();
		String idTipoDoc = oCliente.getTipdoc();
		if(idTipoDoc!=null && idTipoDoc.equals("0"))
			idTipoDoc = "";
		
		map.put("in_tipo_documento", idTipoDoc);
		map.put("in_nro_documento", oCliente.getNrodoc());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarNoClientes",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<NoCliente> getDatosBasicosNoCliente(NoCliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("in_idnocliente", oCliente.getIdnocliente());
		
		System.out.println("sp: IIAF.piiaf_asesoria3.sp_cons_as_basica_ncl, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.getDatosBasicosNoCliente",map);
		return (List<NoCliente>)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Cliente> listarPosicionActual(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarPosicionActual",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Cliente> listarDatosPerfilInversion(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarDatosPerfilInversion",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarDatosAdicionales(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarDatosAdicionales",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarSituacionActualCatActivos(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		map.put("codregistro", oCliente.getCodregcrea());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarSituacionActualCatActivos",map);
		return (List)map.get("result");
	}

	@SuppressWarnings("unchecked")
	public List<HashMap> listarDatosBasicos(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		
		System.out.println("sp: IIAF.piiaf_asesoria.sp_cons_as_basica_cl, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarDatosBasicos",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public HashMap crearNoCliente(NoCliente noCliente, UsuarioSesion usuario){
		HashMap map=new HashMap();
		try{
			map.put("in_idtipodocumento", noCliente.getTipdoc());
			map.put("in_nrodocumento", noCliente.getNrodoc());
			map.put("in_nombrerazonsocial", noCliente.getNombrerazonSocial());
			map.put("in_email", noCliente.getEmail());
			map.put("in_telefonofijo", noCliente.getTelffijo());
			map.put("in_telefonocelular", noCliente.getTelfcelular());
			map.put("in_codigoregistrocreacion", noCliente.getCodregcrea());
			map.put("in_fechacreacion", Util.formatearFechaDate(new Date(), "yyyyMMdd"));
			map.put("in_terminalcreacion", noCliente.getTerminacrea());
			getSqlMapClientTemplate().update("BP_CLIENTE_SqlMap.crearNoCliente", map);
			map.put("result", "ok");
		}catch(Exception e){
			e.printStackTrace();
			map.put("result", "Error interno. "+Util.obtenerMensajeError(e));
		}
		return map;
	}
	
	@SuppressWarnings("unchecked")
	public HashMap editarNoCliente(NoCliente noCliente, UsuarioSesion usuario){
		HashMap map=new HashMap();
		try{
			map.put("in_idnocliente", noCliente.getIdnocliente());
			map.put("in_idtipodocumento", noCliente.getTipdoc());
			map.put("in_nrodocumento", noCliente.getNrodoc());
			map.put("in_nombrerazonsocial", noCliente.getNombrerazonSocial());
			map.put("in_email", noCliente.getEmail());
			map.put("in_telefonofijo", noCliente.getTelffijo());
			map.put("in_telefonocelular", noCliente.getTelfcelular());
			map.put("in_codigoregistromodificacion", noCliente.getCodregmodi());
			map.put("in_fechamodificacion", Util.formatearFechaDate(new Date(), "yyyyMMdd"));
			map.put("in_terminalmodificacion", noCliente.getTerminalmodi());
			getSqlMapClientTemplate().update("BP_CLIENTE_SqlMap.editarNoCliente", map);
			map.put("result", "ok");
		}catch(Exception e){
			e.printStackTrace();
			map.put("result", "Error interno. "+Util.obtenerMensajeError(e));
		}
		return map;
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarDisXTipoProductoXMoneda(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		map.put("codregistro", oCliente.getCodregcrea());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarDisXTipoProductoXMonedas",map);
		return (List)map.get("result");
	}	
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarDisXTipoProducto(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		map.put("codregistro", oCliente.getCodregcrea());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarDisXTipoProducto",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarExpEspActivosParticulares(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		map.put("codregistro", oCliente.getCodregcrea());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarExpEspActivosParticulares",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarDetExpEspActivosParticulares(Cliente oCliente,String codidlimitervrf) throws Exception{
		HashMap map=new HashMap();
		map.put("codcliente", oCliente.getCodcliente());
		map.put("codidlimitervrf", codidlimitervrf);
		map.put("codregistro", oCliente.getCodregcrea());		
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarDetExpEspActivosParticulares",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Cliente> listarClienteNoAsignados(Cliente oCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("in_nombres", oCliente.getNombres().toString());
		map.put("in_nrodocumento", oCliente.getNrodoc().toString());
		map.put("in_idusuarioasesor", "");		
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarClienteNoAsignados",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public void grabarClientesAsignados(UsuarioAsesor usuarioAsesor, String clientes) throws Exception{
		HashMap map=new HashMap();
		
		map.put("in_idusuarioasesor", new BigDecimal(usuarioAsesor.getIdUsuarioAsesor().intValue()));
		map.put("in_codcliente", clientes);
		map.put("in_fecharegistro", Util.retornaFecha(new Date()));
		getSqlMapClientTemplate().update("BP_CLIENTE_SqlMap.grabarClientesAsignados", map);
	}
	
	@SuppressWarnings("unchecked")
	public List<Cliente> listarEjecutivosDeClientes(Cliente objCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("tipoDocumento", objCliente.getTipdoc());
		map.put("nroDocumento", objCliente.getNrodoc());
		map.put("fechaDesde", objCliente.getFecharegistro());
		map.put("fechaHasta", objCliente.getFechaExpiracion());
		map.put("idUsuarioAsesor", objCliente.getIdusuarioasesor().toString());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.listarEjecutivosDeClientes",map);
		return (List)map.get("result");
	}
	
	public HashMap<String,Object> updateCamposBasicosCliente(Cliente oCliente) throws Exception{
		HashMap<String,Object> map = new HashMap<String,Object>();
		map.put("in_cod_cliente", oCliente.getCodcliente());
		map.put("in_email", oCliente.getEmailClie());
		map.put("in_direccion", oCliente.getDireccionClie());
		map.put("in_telefono", oCliente.getTelefonoClie());
		getSqlMapClientTemplate().queryForList("BP_CLIENTE_SqlMap.updateCamposBasicosCliente",map);
		
		return map;
	}
}
